package com.helpdesk.controlador;

import com.helpdesk.entidades.HdTickets;
import com.helpdesk.controlador.util.JsfUtil;
import com.helpdesk.controlador.util.PaginationHelper;
import com.helpdesk.dao.HdTicketsFacade;
import com.helpdesk.entidades.HdEstados;
import com.helpdesk.entidades.HdTecnicos;
import com.helpdesk.entidades.HdUsuarios;
import com.helpdesk.utilidades.EnviarCorreos;
import com.helpdesk.ejb.MBLogin;
import com.helpdesk.entidades.*;

import java.io.Serializable;
import java.util.Date;
import java.util.List;
import java.util.ResourceBundle;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.FacesConverter;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;
import javax.faces.model.SelectItem;

@ManagedBean(name = "hdTicketsController")
@SessionScoped
public class HdTicketsController implements Serializable {

    private HdTickets current;
    private DataModel items = null;
    private DataModel ticketsSolicitante;
    private DataModel usuarioSolicitante;
    private DataModel AllTickets;
    private DataModel ticketEstado;
    private DataModel ticketByJefe;
    private DataModel TicketsJefe;
    private DataModel ticketByTec;
    private DataModel TicketsCerrados;
    private DataModel ticketsPendientesCierre;
    private DataModel TicketsPendientes;
    private List<HdTecnicos> TecSelected;
    private HdTecnicos codTecnico;
    private HdTecnicos codJefe;
    private HdUsuarios codUsuario;
    private HdEstados codEstado;
    private HdTickets Ticket = new HdTickets();
    private HdTicketsFacade daoTickets;
    private HdTickets selectedT;
    private HdClasifiBaja clasificacion;
    private Date fecAsignacion;
    
    @EJB
    private com.helpdesk.dao.HdTicketsFacade ejbFacade;
    @EJB
    private com.helpdesk.dao.HdTecnicosFacade ejbTec;
    @EJB
    private com.helpdesk.dao.HdAsesorFacade ejbAsesor;
    private com.helpdesk.ejb.MBLogin ejbLogin;
    private PaginationHelper pagination;
    private int selectedItemIndex;
    private String tecDisponible;

    public HdTicketsController() {
    }
    
    public void setTicketsCerrados(DataModel TicketsCerrados) {
        this.TicketsCerrados = TicketsCerrados;
    }
    
    public void setTicketsJefe(DataModel TicketsJefe) {
        this.TicketsJefe = TicketsJefe;
    }
    
    public void setTicketByJefe(DataModel ticketByJefe) {
        this.ticketByJefe = ticketByJefe;
    }
    
    public void setSelectedT(HdTickets selectedT) {
        this.selectedT = selectedT;
    }
    
    public void setAllTickets(DataModel AllTickets) {
        this.AllTickets = AllTickets;
    }

    public DataModel getTicketsPendientesCierre() {
        MBLogin log = (MBLogin) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("mBLogin");

        try {
            HdUsuarios User = log.getUs();
            List<HdTickets> lista = ejbFacade.ShowTicketsUserPendientesCierre(User);
            ticketsPendientesCierre = new ListDataModel(lista);
            return ticketsPendientesCierre;
        } catch (Exception e) {
            return null;
        }
    }

    public void setTicketsPendientesCierre(DataModel ticketsPendientesCierre) {
        this.ticketsPendientesCierre = ticketsPendientesCierre;
    }

    public DataModel getTicketsPendientes() {
        MBLogin log = (MBLogin) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("mBLogin");

        try {
            HdUsuarios User = log.getUs();
            List<HdTickets> lista = ejbFacade.ShowTicketsUserPendientes(User);
            ticketsPendientesCierre = new ListDataModel(lista);
            return TicketsPendientes;
        } catch (Exception e) {
            return null;
        }
        
    }

    public void setTicketsPendientes(DataModel TicketsPendientes) {
        this.TicketsPendientes = TicketsPendientes;
    }

    public HdEstados getCodEstado() {
        return codEstado;
    }

    public void setCodEstado(HdEstados codEstado) {
        this.codEstado = codEstado;
    }
    
    public HdTickets getSelectedT() {
        return selectedT;
    }
    
    public void setTicketByTec(DataModel ticketByTec) {
        this.ticketByTec = ticketByTec;
    }
    
    public void setUsuarioSolicitante(DataModel usuarioSolicitante) {
        this.usuarioSolicitante = usuarioSolicitante;
    }
     
    public void setTicketsSolicitante(DataModel ticketsSolicitante) {
        this.ticketsSolicitante = ticketsSolicitante;
    }
    
    public DataModel getTicketsCerrados() {
        MBLogin log = (MBLogin) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("mBLogin");
        try {
            HdUsuarios User = log.getUs();
            List<HdTickets> lista = ejbFacade.ShowTicketsUserCerrados(User);
            TicketsCerrados = new ListDataModel(lista);
            return TicketsCerrados;
        } catch (Exception e) {
            return null;
        }
    }

    public DataModel getTicketsJefe() {
        MBLogin log = (MBLogin) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("mBLogin");
        try {
            HdEstados estado = new HdEstados(4);
            HdTecnicos jefe = ejbTec.codTecnicoByUsuario(log.getUs());
            List<HdTickets> lista = ejbFacade.ShowTicketsJefe(estado, jefe);
            TicketsJefe = new ListDataModel(lista);
            return TicketsJefe;
        } catch (Exception e) {
            return null;
        }
    }
    
    public DataModel getTicketByTecAndPendiente() {
        MBLogin log = (MBLogin) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("mBLogin");
        try {
            codTecnico = ejbTec.codTecnicoByUsuario(log.getUs());
            List<HdTickets> lista = ejbFacade.TicketByTecnicoAndEstado(codTecnico,8);
            TicketsCerrados = new ListDataModel(lista);
            return TicketsCerrados;
        } catch (Exception e) {
            return null;
        }
    }
    
    public DataModel getTicketByTecAndCerrado() {
        MBLogin log = (MBLogin) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("mBLogin");
        try {
            codTecnico = ejbTec.codTecnicoByUsuario(log.getUs());
            List<HdTickets> lista = ejbFacade.TicketByTecnicoAndEstado(codTecnico, 7);
            ticketByJefe = new ListDataModel(lista);
            return ticketByJefe;
        } catch (Exception e) {
            return null;
        }
    }

    public DataModel getTicketByJefeProAndAsig() {
        try {
            MBLogin log = (MBLogin) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("mBLogin");
            codTecnico = ejbTec.codTecnicoByUsuario(log.getUs());
            List<HdTickets> lista = ejbFacade.getTicketByCodJefe(codTecnico, 1, 3);
            ticketByJefe = new ListDataModel(lista);
            return ticketByJefe;
        } catch (Exception e) {
            return null;
        }
    }

    public DataModel getAllTickets() {
        try {
            List<HdTickets> lista = ejbFacade.buscarTodos();
            AllTickets = new ListDataModel(lista);
            return AllTickets;
        } catch (Exception e) {
            return null;
        }
    }

    public DataModel getUsuarioSolicitante() {
        try {
            List<HdTickets> lista = ejbFacade.buscarShowTicketsBySolicitante(codUsuario);
            ticketsSolicitante = new ListDataModel(lista);
            return usuarioSolicitante;
        } catch (Exception e) {
            return null;
        }
    }

    public DataModel getTicketsSolicitante() {
        try {
            List<HdTickets> lista = ejbFacade.buscarShowTicketsBySolicitante(codUsuario);
            ticketsSolicitante = new ListDataModel(lista);
            return ticketsSolicitante;
        } catch (Exception e) {
            return null;
        }
    }

    public DataModel getTicketEstado() {
        try {
            HdEstados estado = new HdEstados(2);
            List<HdTickets> lista = ejbFacade.ShowTicketsByEstado(estado);
            ticketEstado = new ListDataModel(lista);
            return ticketEstado;
        } catch (Exception e) {
            return null;
        }
    }

    /**
     * @param ticketEstado the ticketEstado to set
     */
    public void setTicketEstado(DataModel ticketEstado) {
        this.ticketEstado = ticketEstado;
    }

    public HdUsuarios getCodUsuario() {
        return codUsuario;
    }

    public void setCodUsuario(HdUsuarios codUsuario) {
        this.codUsuario = codUsuario;
    }

    public HdTecnicos getCodTecnico() {
        return codTecnico;
    }

    public void setCodTecnico(HdTecnicos codTecnico) {
        this.codTecnico = codTecnico;
    }

    public Date getFecAsignacion() {
        return fecAsignacion;
    }

    public void setFecAsignacion(Date fecAsignacion) {
        this.fecAsignacion = fecAsignacion;
    }

    public String getTecDisponible() {
        try {
            if (ejbFacade.tecnicoDisponible(codTecnico.getCodTecnico(), fecAsignacion)) {
                return "Esta Disponible";
            } else {
                return "No esta Disponible";
            }
        } catch (Exception e) {
            return "";
        }
    }

    public void setTecDisponible(String tecDisponible) {
        this.tecDisponible = tecDisponible;
    }

    public HdTickets getTicket() {
        return Ticket;
    }

    public void setTicket(HdTickets Ticket) {
        this.Ticket = Ticket;
    }

    public HdTecnicos getCodJefe() {
        return codJefe;
    }

    public void setCodJefe(HdTecnicos codJefe) {
        this.codJefe = codJefe;
    }

//-------------------------------------------------------------------------    
    public HdTickets getSelected() {
        if (current == null) {
            current = new HdTickets();
            selectedItemIndex = -1;
        }
        return current;
    }

    private HdTicketsFacade getFacade() {
        return ejbFacade;
    }

    public PaginationHelper getPagination() {
        if (pagination == null) {
            pagination = new PaginationHelper(10) {
                @Override
                public int getItemsCount() {
                    return getFacade().count();
                }

                @Override
                public DataModel createPageDataModel() {
                    return new ListDataModel(getFacade().findRange(new int[]{getPageFirstItem(), getPageFirstItem() + getPageSize()}));
                }
            };
        }
        return pagination;
    }

    public String prepareList() {
        recreateModel();
        return "List";
    }

    public String prepareView() {
        current = (HdTickets) getItems().getRowData();
        selectedItemIndex = pagination.getPageFirstItem() + getItems().getRowIndex();
        return "View";
    }

    public String prepareCreate() {
        current = new HdTickets();
        selectedItemIndex = -1;
        return "Create";
    }

    public String create() {
        try {
            getFacade().create(current);
            JsfUtil.addSuccessMessage(ResourceBundle.getBundle("/Bundle").getString("HdTicketsCreated"));
            return prepareCreate();
        } catch (Exception e) {
            JsfUtil.addErrorMessage(e, ResourceBundle.getBundle("/Bundle").getString("PersistenceErrorOccured"));
            return null;
        }
    }

    public String create1(int usuario) {
        java.util.Date fecha = new Date();
        try {
            current.setFecRegistro(fecha); // Se setea la fecha de Hoy
            current.setCodUsuario(new HdUsuarios(usuario));
            current.setCodEstado(new HdEstados(2)); // Se setea el estado Creada
            getFacade().create(current);
            JsfUtil.addSuccessMessage("Registro Almacenado con exito");
            // Se notifica por correo
            try {
                EnviarCorreos correo = new EnviarCorreos(current.getCodAsesor().getCodUsuario().getMailUsuario(), "Notificacion de Asignacion de Tickets", "Atentamente se le notifica que se le ha asignado el Ticket " + current.getCodTicket() + " Para que pueda ser canalizado");
            } catch (Exception e) {
                e.printStackTrace();
            }
            current = new HdTickets();
            selectedItemIndex = -1;
            return "";
        } catch (Exception e) {
            JsfUtil.addErrorMessage(e, ResourceBundle.getBundle("/Bundle").getString("PersistenceErrorOccured"));
            current = new HdTickets();
            return null;
        }
    }

    public String aceptar(HdTickets Tick){
        java.util.Date fecha = new Date();
        try {
            current = Tick;
            current.setCodEstado(new HdEstados(7));
            current.setFecResolucionReal(fecha);
            getFacade().edit(Tick);
            JsfUtil.addSuccessMessage("Se Acepto el Cierre");
            current = new HdTickets();
            selectedItemIndex = -1;
            return "";
        } catch (Exception e) {
            JsfUtil.addErrorMessage(e, ResourceBundle.getBundle("/Bundle").getString("PersistenceErrorOccured"));
            current = new HdTickets();
            return null;
        }
    }
    public String rechazar(HdTickets Tick){
        try {
            current = Tick;
            current.setCodEstado(new HdEstados(5));
            getFacade().edit(Tick);
            JsfUtil.addSuccessMessage("Se Rechazo el Ticket");
            current = new HdTickets();
            selectedItemIndex = -1;
            return "";
        } catch (Exception e) {
            JsfUtil.addErrorMessage(e, ResourceBundle.getBundle("/Bundle").getString("PersistenceErrorOccured"));
            current = new HdTickets();
            return null;
        }
    }
    
    public String prepareEdit() {
        current = (HdTickets) getItems().getRowData();
        selectedItemIndex = pagination.getPageFirstItem() + getItems().getRowIndex();
        return "Edit";
    }

    public String prepareAsigar() {
        current = (HdTickets) getItems().getRowData();
        selectedItemIndex = pagination.getPageFirstItem() + getItems().getRowIndex();
        return "asignaJefe";
    }

    public String prepareCambestado() {
        current = (HdTickets) getItems().getRowData();
        selectedItemIndex = pagination.getPageFirstItem() + getItems().getRowIndex();
        return "cambiaEstado";
    }

    public String update() {
        try {
            getFacade().edit(current);
            JsfUtil.addSuccessMessage(ResourceBundle.getBundle("/Bundle").getString("HdTicketsUpdated"));
            return "View";
        } catch (Exception e) {
            JsfUtil.addErrorMessage(e, ResourceBundle.getBundle("/Bundle").getString("PersistenceErrorOccured"));
            return null;
        }
    }

    public String update1(HdTecnicos jefe, HdTickets tick, HdClasifiBaja clasi) {
        java.util.Date fecha = new Date();
        try {
            MBLogin log = (MBLogin) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("mBLogin");
            current = tick;
            current.setCodJefe(jefe);
            current.setCodEstado(new HdEstados(4));
            int codu = log.getUs().getCodUsuario();
            HdAsesor Ase = ejbAsesor.BuscarIdAsesor(codu);
            current.setFecCanalizado(fecha);
            current.setCodAsesor(Ase);
            current.setCodClasiBaja(clasi);
            getFacade().edit(current);
            JsfUtil.addSuccessMessage("Se Asigno Jefe de Tecnicos para el Ticket: " + current.getCodTicket());
            // Se notifica por correo
            try {
                EnviarCorreos correo = new EnviarCorreos(current.getCodJefe().getCodUsuario().getMailUsuario(), "Notificacion de Asignacion de Tickets", "Atentamente se le notifica que se le ha asignado el Ticket " + current.getCodTicket() + " Para que pueda ser Asignado a tecnicos");
                current = new HdTickets();
            } catch (Exception e) {
                e.printStackTrace();
            }
            return "";
        } catch (Exception e) {
            JsfUtil.addErrorMessage(e, ResourceBundle.getBundle("/Bundle").getString("PersistenceErrorOccured"));
            return null;
        }
    }
    public String updateWorkgroup(HdTecnicos jefe, HdTickets tick, HdClasifiBaja clasi) {
        java.util.Date fecha = new Date();
        try {
            MBLogin log = (MBLogin) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("mBLogin");
            current = tick;
            current.setCodJefe(jefe);
            current.setCodEstado(new HdEstados(3));
            codTecnico = ejbTec.codTecnicoByUsuario(log.getUs());
            current.setFecCanalizado(fecha);
            current.setCodJefe(codTecnico);
            current.setCodClasiBaja(clasi);
            getFacade().edit(current);
            JsfUtil.addSuccessMessage("Se Asigno Jefe de Tecnicos para el Ticket: " + current.getCodTicket());
            // Se notifica por correo
            try {
                EnviarCorreos correo = new EnviarCorreos(current.getCodJefe().getCodUsuario().getMailUsuario(), "Notificacion de Asignacion de Tickets", "Atentamente se le notifica que se le ha asignado el Ticket " + current.getCodTicket() + " Para que pueda ser Asignado a tecnicos");
                current = new HdTickets();
            } catch (Exception e) {
                e.printStackTrace();
            }
            return "";
        } catch (Exception e) {
            JsfUtil.addErrorMessage(e, ResourceBundle.getBundle("/Bundle").getString("PersistenceErrorOccured"));
            return null;
        }
    }

    public String AsignarTecnicos(HdTecnicos tecnicos, HdTickets tick) {
        java.util.Date fecha = new Date();
        try {

            MBLogin log = (MBLogin) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("mBLogin");
            current = tick;
            current.setCodEstado(new HdEstados(3));
            getFacade().edit(current);
            JsfUtil.addSuccessMessage("Se Asigno Tecnico para el Ticket: " + current.getCodTicket());
            // Se notifica por correo
            try {
                EnviarCorreos correo = new EnviarCorreos(current.getCodJefe().getCodUsuario().getMailUsuario(), "Notificacion de Asignacion de Tickets", "Atentamente se le notifica que se le ha asignado el Ticket " + current.getCodTicket() + " Para que pueda ser Asignado a tecnicos");
                current = new HdTickets();
            } catch (Exception e) {
                e.printStackTrace();
            }
            return "";
        } catch (Exception e) {
            JsfUtil.addErrorMessage(e, ResourceBundle.getBundle("/Bundle").getString("PersistenceErrorOccured"));
            return null;
        }
    }

    public String update2() {
        try {

            getFacade().edit(current);
            JsfUtil.addSuccessMessage("registro se ha Actualizado Satisfactoriamente");
            // Se notifica por correo
            try {
                EnviarCorreos correo = new EnviarCorreos(current.getCodUsuario().getMailUsuario(), "Notificacion de Asignacion de Tickets", "Atentamente se le notifica que el Ticket " + current.getCodTicket() + " ha cambiado al estado: " + current.getCodEstado().getDescEstado());
            } catch (Exception e) {
                e.printStackTrace();
            }
            return "";
        } catch (Exception e) {
            JsfUtil.addErrorMessage(e, ResourceBundle.getBundle("/Bundle").getString("PersistenceErrorOccured"));
            return null;
        }
    }

    
    
    public String updateTec(HdTickets codTicket) {
        try {
            codTicket.setCodEstado(new HdEstados(8));
            getFacade().edit(codTicket);
            JsfUtil.addSuccessMessage("registro se ha Actualizado Satisfactoriamente");
            // Se notifica por correo
            try {
                EnviarCorreos correo = new EnviarCorreos(codTicket.getCodUsuario().getMailUsuario(), "Notificacion de Asignacion de Tickets", "Atentamente se le notifica que el Ticket " + codTicket.getCodTicket() + " ha cambiado al estado: PENDIENTE DE CERRADO Favor Verificar para cerrar el ticket");
            } catch (Exception e) {
                e.printStackTrace();
            }
            return "";
        } catch (Exception e) {
            JsfUtil.addErrorMessage(e, ResourceBundle.getBundle("/Bundle").getString("PersistenceErrorOccured"));
            return null;
        }
    }

    public String destroy() {
        current = (HdTickets) getItems().getRowData();
        selectedItemIndex = pagination.getPageFirstItem() + getItems().getRowIndex();
        performDestroy();
        recreatePagination();
        recreateModel();
        return "List";
    }

    public String destroyAndView() {
        performDestroy();
        recreateModel();
        updateCurrentItem();
        if (selectedItemIndex >= 0) {
            return "View";
        } else {
            // all items were removed - go back to list
            recreateModel();
            return "List";
        }
    }

    private void performDestroy() {
        try {
            getFacade().remove(current);
            JsfUtil.addSuccessMessage(ResourceBundle.getBundle("/Bundle").getString("HdTicketsDeleted"));
        } catch (Exception e) {
            JsfUtil.addErrorMessage(e, ResourceBundle.getBundle("/Bundle").getString("PersistenceErrorOccured"));
        }
    }

    private void updateCurrentItem() {
        int count = getFacade().count();
        if (selectedItemIndex >= count) {
            // selected index cannot be bigger than number of items:
            selectedItemIndex = count - 1;
            // go to previous page if last page disappeared:
            if (pagination.getPageFirstItem() >= count) {
                pagination.previousPage();
            }
        }
        if (selectedItemIndex >= 0) {
            current = getFacade().findRange(new int[]{selectedItemIndex, selectedItemIndex + 1}).get(0);
        }
    }

    public DataModel getItems() {
        if (items == null) {
            items = getPagination().createPageDataModel();
        }
        return items;
    }

    private void recreateModel() {
        items = null;
    }

    private void recreatePagination() {
        pagination = null;
    }

    public String next() {
        getPagination().nextPage();
        recreateModel();
        return "List";
    }

    public String previous() {
        getPagination().previousPage();
        recreateModel();
        return "List";
    }

    public SelectItem[] getItemsAvailableSelectMany() {
        return JsfUtil.getSelectItems(ejbFacade.findAll(), false);
    }

    public SelectItem[] getItemsAvailableSelectOne() {
        return JsfUtil.getSelectItems(ejbFacade.findAll(), true);
    }

    /**
     * @return the TecSelected
     */
    public List<HdTecnicos> getTecSelected() {
        return TecSelected;
    }

    /**
     * @param TecSelected the TecSelected to set
     */
    public void setTecSelected(List<HdTecnicos> TecSelected) {
        this.TecSelected = TecSelected;
    }

    @FacesConverter(forClass = HdTickets.class)
    public static class HdTicketsControllerConverter implements Converter {

        public Object getAsObject(FacesContext facesContext, UIComponent component, String value) {
            if (value == null || value.length() == 0) {
                return null;
            }
            HdTicketsController controller = (HdTicketsController) facesContext.getApplication().getELResolver().
                    getValue(facesContext.getELContext(), null, "hdTicketsController");
            return controller.ejbFacade.find(getKey(value));
        }

        java.lang.Integer getKey(String value) {
            java.lang.Integer key;
            key = Integer.valueOf(value);
            return key;
        }

        String getStringKey(java.lang.Integer value) {
            StringBuffer sb = new StringBuffer();
            sb.append(value);
            return sb.toString();
        }

        public String getAsString(FacesContext facesContext, UIComponent component, Object object) {
            if (object == null) {
                return null;
            }
            if (object instanceof HdTickets) {
                HdTickets o = (HdTickets) object;
                return getStringKey(o.getCodTicket());
            } else {
                throw new IllegalArgumentException("object " + object + " is of type " + object.getClass().getName() + "; expected type: " + HdTicketsController.class.getName());
            }
        }
    }

    public String validaAccion() {
        //   return "validaDisponibilidad2";
        return "";
    }

    public String ejecutaAccion() {
        //return "ticketsBySolicitante2";
        return "";
    }

    public String agregarTicket() {
        daoTickets.agregarTicket(current);
        return "";
    }
}
